#include <stdio.h>
extern "C" {
    #include <lua.h>
    #include <lauxlib.h>
    #include <lualib.h>
}
extern "C"
{
extern int luaopen_mytestlib(lua_State* L);    
}

int register_mytestlib(lua_State* L);
#include "c_call_lua.h"

//call function without param put in
int lua_execute(const char * luaFileName, const char* funcNameInFile)
{
    lua_State *L = luaL_newstate(); //新建lua解释器
    luaL_openlibs(L); //载入lua所有函数库
    register_mytestlib(L);
    luaL_dofile(L, luaFileName); //执行"Test.lua"文件中的代码
    
    lua_getglobal(L, funcNameInFile); //获取add函数
    lua_pcall(L, 0, 1, 0);
    int ret = (int)lua_tonumber(L, -1);
    lua_pop(L, 1);
    lua_close(L); //释放
    return ret;
}

int lua_execute_file(const char * luaFileName)
{
    lua_State *L = luaL_newstate(); //新建lua解释器
    luaL_openlibs(L); //载入lua所有函数库

    register_mytestlib(L);
    luaL_loadfile(L, luaFileName); //执行"Test.lua"文件中的代码
    
    //lua_getglobal(L, funcNameInFile); //获取add函数
    lua_pcall(L, 0, 1, 0);
    int ret = (int)lua_tonumber(L, -1);
    lua_pop(L, 1);
    lua_close(L); //释放
    return ret;
}

//调用lua中的add函数
int call_lua_add(lua_State *L)
{
    lua_getglobal(L, "add"); //获取add函数
    lua_pushnumber(L, 123); //第一个操作数入栈
    lua_pushnumber(L, 456); //第二个操作数入栈
    lua_pcall(L, 2, 1, 0); //调用函数，2个参数，1个返回值
    int sum = (int)lua_tonumber(L, -1); //获取栈顶元素（结果）
    lua_pop(L, 1); //栈顶元素出栈
    return sum;
}

int main(int argc, char * argv[])
{
    if(argc<2)
    {
        printf("please input the parameter!\n");
    }
    if(argc==2)
    {
        lua_execute_file(argv[1]);
    }
    else if(argc>=3)
    {
        lua_execute(argv[1],argv[2]);
    }
    
    return 0;
}